評価演算子の解説(BASH SHELL Programing)

 

条件評価のための"△[△condition△]△"

終了ステータスは、制御構造が評価する唯一の対象であるが、コマンドが正しく実行されたかどうかのみを評価しているわけでは有りません。シェルには、さまざまな評価ができるように、ブラケット"[△condition△]"で囲む制御構造が用意されているのです。

"[△condition△]"を使用することで、単純な比較でなく、ファイルのさまざまな属性(ファイルタイプ、パーミション、所有者、存在etc.)を確認したり、当然文字列を比較したり、ファイルの新旧なども比較できるのです。この"[△condition△]"は、ステートメントですが、中に書かれているconditionの終了ステータスが真(true)0か偽(false)1かただそれだけを返すというものであるため、このブラケットは、制御構造文に適したものである。

処理が成功した場合、真(true)で0を返します。

注)このconditionの前後のブラケットは、conditonをはさむ側に必ずSPACEが必要になりますので注意してください。

例) ["$a" = "$b"] 間違い -> [△"$a" = "$b"△] 修正後 SPACEの表現がしずらいので、三角で書いてます。このスペースは、タブ、ハード改行、;でokです。

test

二つの値を比較するテストを行いたいことが良くありますが、このようなことをする場合、testを使います。このtestは、比較が終わり成功すると真(true)0が帰ります。 このコマンドは、整数も扱うことができます。

書き方

test str1 -option str2
test fileA -option strB
test -option str1
test -option fileA

エスケープ \(.......\)

括弧でグループ化ができる。

書き方

[ \( "2" > "1" \) -o \( "1"= "3" \) ]

ここから本番

文字列の比較、fileステータス、file存在、file新旧比較などあくまでも文字比較で書きます。数値では有りません。

  理論演算子 真(true)0の条件
1 -a test1 と test2 真偽の論理積
真(true)0 and 真(true)0 偽(false)1 and 偽(false)1
2 -o

test1 と test2の真偽の論理和
真(true)0 or 真(true)0 偽(false)1 or 偽(false)1 真(true)0 or 偽(false)1

比較演算後の真(true)0偽(false)1に付いて論理演算をします。 []条件式の中で使用します。

  演算子 真(true)0の場合の条件
1 -b file

fileが存在し、かつブロックデバイスファイルである

2 -c file fileが存在し、かつキャラクタブロックデバイスである
3 -d file fileが存在し、かつデレクトリである
4 -e file fileが存在する
5 -f file fileが存在し、かつ通常のファイルである
6 -g file fileが存在し、かつgetgidビットが設定されている
7 -G file fileが存在し、かつ有効なグループIDで所有されている
8 -k file fileが存在し、かつstickyビットが設定されている
9 -L file fileが存在し、かつシンボリックが張られている
10 -n str1 str1がNULLでない。(文字の長さが0より大きい。)
11 -O file fileが存在し、かつ有効なIDが所有されている
12 -p file fileが存在し、かつパイプまたは名前付きパイプFIFOである
13 -r file fileが存在し、かつreadパーミションが与えられている
14 -s file fileが存在し、かつ空でない
15 -S file fileが存在し、かつソケットである
16 -t N ファイルディスクリプタが端末を示している。
17 -u file fileが存在し、かつsetuidビットが設定されている。
18 -w file fileが存在し、かつwriteパーミションが与えられている
19 -x file fileが存在し、かつfileがファイルの場合は、executeパーミションが、ディレクトリの場合は、searchパーミションが与えられる
20 -z str1 str1がNULLである。(文字の長さが0)
21 fileA -nt fileB fileAがfileBよりも新しい(修正日付を基準とする)
22 fileA -ot fileB fileAがfileBよりも古い(修正日付を基準とする)
23 fileA -ef fileB

fileAとfileBが同じファイルを指している(デバイスとinode番号が同じ)

24  
25 str1 = str2 str1がstr2と一致する。
26 str1 != str2 str1がstr2と一致しない。
27 str1 < str2 str1がstr2より小さい。 辞書の順番で
28 str1 > str2 str1がstr2より大きい。 辞書の順番で

理解するには->皆さんが苦労された英語の辞書の順番は、この演算子に沿って並べられています。

文字列演算子を使った例

stra="a"

str2="a"

if [ $str1 = $str2 ]; then # (25)=

echo " str1: $str1 str2: $str2 ストリングスは、同じものです。"

fi

str1="a"

str2="b"

if [ $str1 != $str2 ]; then # (26)!=

echo " str1: $str1 str2: $str2 ストリングスは、別のです。"

fi

str1="a"

str2="ab"

if [ $str1 < $str2 ]; then # (27)<

echo " str1: $str1 str2: $str2 ストリングスは、str1が小さいです。"


str1="ab"

str2="b"

if [ $str1 < $str2 ]; then #(27)<

echo " str1: $str1 str2: $str2 ストリングスは、str1が小さいです。"

fi


fi

str1="ab"

str2="a"

if [ $str1 > $str2 ]; then # (28)>

echo " str1: $str1 str2: $str2 ストリングスは、str1が大きいです。"

fi

str1="a"

if [ -n $str1 ]; then # (10)-n

echo " str1: $str1 ストリングスは、文字があります。"

fi

str1=""

if [ -z $str1 ]; then # (20)-z

echo " str1: $str1 ストリングスは、文字がありません。"

fi


色々な画像ファイル名から画像を判断しgif-fileへ変換し、filen-nameもgifへ変えるプログラムを使って文字列比較演算子の使い方を理解しよう。

filename=$1

extention=${filename##*. } # サフィクス以外を取り除く。

ppmfile=${filename%.*}.ppm # サフィクスを取り除き.ppmを加える。

outfile=${filename%.*}.gif # サフィクスを取り除き.gifを加える。

if [ -z $filename ]; then # (20)-zでfilenameがNULLであるか判断している。

echo "profile: ファイルがありません."

exit # 判定終了

fi

if [ $extention = gif ]; then # (25)=サフィクスがgifの場合そのまま終了。

exit # 判定終了

elif [ $extention = tga ]; then # (25)=サフィックスがtgaの場合

tgatoppm $filename > $ppmfile # tagtoをfilename(tga)で実行し $ppmfile(ppm)に書き込む。

elif [ $extention = xpm ]; then # (25)=

xpmtoppm $filename > $ppmfile

elif [ $extention = pcx ]: then # (25)=

pcxtoppm $filename > $ppmfile

elif [ $extention = tif ]; then # (25)=

tifftoppm $filename > $ppmfile

elif [ $extention =jpg ]; then # (25)=

djpeg $filename > $ppmfile

else # サフィクスが該当しない場合の処理を行う。

echoo "profile: $filename 処理対象にない画像ファイルです。"

exit # 判定終了

fi

ppmquant -quiet 256 $ppmfile | ppmogif -quiet > $outfile # ppmに加工されたfileを変換あわせて、サフィクスgifへ変えた名前で書き出す。

rm $ppnfile # tmpとして作成された.ppmを消す。

## stop run ##


Last edit was Monday, 06/17/2002 <back> <top>

テレワークならECナビ Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!
無料ホームページ 無料のクレジットカード 海外格安航空券 海外旅行保険が無料! 海外ホテル